class kList {

    constructor(arr = []) {
        this.data = arr;
    }

    /**
     * 将数据列表中的item[key]重组为一个新的数组并返回
     * @param {String} key
     * @param {boolean} unique - 是否过滤重复项
     * @returns {Array}
     */
    selectProp(key, unique = false) {
        if (typeof key !== 'string' || key.length === 0) {
            return [];
        }
        if (unique) {
            const list = new Set();
            this.data.forEach(function (item) {
                list.add(item[key]);
            });
            return Array.from(list);
        } else {
            const result = [];
            this.data.forEach(function (item) {
                result.push(item[key]);
            });
            return result;
        }
    }

    /**
     * 获取数据列表中的item[key]的合计值
     * @param {String} key - 属性名。如果不指定，则视为累加整个数组
     * @returns {Number}
     */
    selectSum(key) {
        let total = 0;
        if (typeof (key) === 'string' && key.length > 0) {
            this.data.forEach(function (item) {
                total += item[key];
            });
        } else {
            this.data.forEach(function (item) {
                total += item;
            });
        }
        return total;

    }

    /**
     * 获取列表中最小的数值
     * @param {String} key
     * @returns {*}
     */
    selectMin(key) {
        if (this.data.length === 0) {
            return;
        }
        let result;

        if (typeof (key) === 'string' && key.length > 0) {
            result = this.data[0][key];
            this.data.forEach(item => {
                if (item[key] < result)
                    result = item[key];
            });
        } else {
            result = this.data[0];
            this.data.forEach(item => {
                if (item < result)
                    result = item;
            });
        }
        return result;
    }

    /**
     * 获取列表中最大的数值
     * @param {String} key
     * @returns {*}
     */
    selectMax(key) {
        if (this.data.length === 0) {
            return;
        }
        let result;

        if (typeof (key) === 'string' && key.length > 0) {
            result = this.data[0][key];
            this.data.forEach(item => {
                if (item[key] > result)
                    result = item[key];
            });
        } else {
            result = this.data[0];
            this.data.forEach(item => {
                if (item > result)
                    result = item;
            });
        }
        return result;
    }

    /**
     * 数组升序排列（会影响数据源）
     * @param key
     * @returns {*[]}
     * @constructor
     */
    Asc(key) {
        if (typeof key === 'string') {
            this.data.sort(function (b, a) {
                return b[key] - a[key];
            });
        } else {
            this.data.sort(function (b, a) {
                return b - a;
            });
        }
        return this.data;
    }

    /**
     * 数组降序排列（会影响数据源）
     * @param key
     * @returns {*[]}
     * @constructor
     */
    Desc(key) {
        if (typeof key === 'string') {
            this.data.sort(function (b, a) {
                return a[key] - b[key];
            });
        } else {
            this.data.sort(function (b, a) {
                return a - b;
            });
        }
        return this.data;
    }
}

export {
    kList
}
export default kList;
